home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / gng.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  5KB  |  180 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw.c
  4.  
  5.   Functions to emulate the video hardware of the machine.
  6.  
  7. ***************************************************************************/
  8.  
  9. #include "driver.h"
  10.  
  11. extern unsigned char *spriteram;
  12. extern size_t spriteram_size;
  13.  
  14. unsigned char *gng_fgvideoram,*gng_fgcolorram;
  15. unsigned char *gng_bgvideoram,*gng_bgcolorram;
  16. static struct tilemap *bg_tilemap,*fg_tilemap;
  17. static int flipscreen;
  18.  
  19.  
  20.  
  21. /***************************************************************************
  22.  
  23.   Callbacks for the TileMap code
  24.  
  25. ***************************************************************************/
  26.  
  27. static void get_fg_tile_info(int tile_index)
  28. {
  29.     unsigned char attr = gng_fgcolorram[tile_index];
  30.     SET_TILE_INFO(0,gng_fgvideoram[tile_index] + ((attr & 0xc0) << 2),attr & 0x0f)
  31.     tile_info.flags = TILE_FLIPYX((attr & 0x30) >> 4);
  32. }
  33.  
  34. static void get_bg_tile_info(int tile_index)
  35. {
  36.     unsigned char attr = gng_bgcolorram[tile_index];
  37.     SET_TILE_INFO(1,gng_bgvideoram[tile_index] + ((attr & 0xc0) << 2),attr & 0x07)
  38.     tile_info.flags = TILE_FLIPYX((attr & 0x30) >> 4) | TILE_SPLIT((attr & 0x08) >> 3);
  39. }
  40.  
  41.  
  42.  
  43. /***************************************************************************
  44.  
  45.   Start the video hardware emulation.
  46.  
  47. ***************************************************************************/
  48.  
  49. int gng_vh_start(void)
  50. {
  51.     fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,32,32);
  52.     bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_cols,TILEMAP_SPLIT,    16,16,32,32);
  53.  
  54.     if (!fg_tilemap || !bg_tilemap)
  55.         return 1;
  56.  
  57.     fg_tilemap->transparent_pen = 3;
  58.  
  59.     bg_tilemap->transmask[0] = 0xff; /* split type 0 is totally transparent in front half */
  60.     bg_tilemap->transmask[1] = 0x01; /* split type 1 has pen 1 transparent in front half */
  61.  
  62.     return 0;
  63. }
  64.  
  65.  
  66. /***************************************************************************
  67.  
  68.   Memory handlers
  69.  
  70. ***************************************************************************/
  71.  
  72. WRITE_HANDLER( gng_fgvideoram_w )
  73. {
  74.     if (gng_fgvideoram[offset] != data)
  75.     {
  76.         gng_fgvideoram[offset] = data;
  77.         tilemap_mark_tile_dirty(fg_tilemap,offset);
  78.     }
  79. }
  80.  
  81. WRITE_HANDLER( gng_fgcolorram_w )
  82. {
  83.     if (gng_fgcolorram[offset] != data)
  84.     {
  85.         gng_fgcolorram[offset] = data;
  86.         tilemap_mark_tile_dirty(fg_tilemap,offset);
  87.     }
  88. }
  89.  
  90. WRITE_HANDLER( gng_bgvideoram_w )
  91. {
  92.     if (gng_bgvideoram[offset] != data)
  93.     {
  94.         gng_bgvideoram[offset] = data;
  95.         tilemap_mark_tile_dirty(bg_tilemap,offset);
  96.     }
  97. }
  98.  
  99. WRITE_HANDLER( gng_bgcolorram_w )
  100. {
  101.     if (gng_bgcolorram[offset] != data)
  102.     {
  103.         gng_bgcolorram[offset] = data;
  104.         tilemap_mark_tile_dirty(bg_tilemap,offset);
  105.     }
  106. }
  107.  
  108.  
  109. WRITE_HANDLER( gng_bgscrollx_w )
  110. {
  111.     static unsigned char scrollx[2];
  112.     scrollx[offset] = data;
  113.     tilemap_set_scrollx( bg_tilemap, 0, scrollx[0] + 256 * scrollx[1] );
  114. }
  115.  
  116. WRITE_HANDLER( gng_bgscrolly_w )
  117. {
  118.     static unsigned char scrolly[2];
  119.     scrolly[offset] = data;
  120.     tilemap_set_scrolly( bg_tilemap, 0, scrolly[0] + 256 * scrolly[1] );
  121. }
  122.  
  123.  
  124. WRITE_HANDLER( gng_flipscreen_w )
  125. {
  126.     flipscreen = ~data & 1;
  127.     tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  128. }
  129.  
  130.  
  131.  
  132. /***************************************************************************
  133.  
  134.   Display refresh
  135.  
  136. ***************************************************************************/
  137.  
  138. static void draw_sprites(struct osd_bitmap *bitmap)
  139. {
  140.     const struct GfxElement *gfx = Machine->gfx[2];
  141.     const struct rectangle *clip = &Machine->drv->visible_area;
  142.     int offs;
  143.     for (offs = spriteram_size - 4;offs >= 0;offs -= 4){
  144.         unsigned char attributes = spriteram[offs+1];
  145.         int sx = spriteram[offs + 3] - 0x100 * (attributes & 0x01);
  146.         int sy = spriteram[offs + 2];
  147.         int flipx = attributes & 0x04;
  148.         int flipy = attributes & 0x08;
  149.  
  150.         if (flipscreen){
  151.             sx = 240 - sx;
  152.             sy = 240 - sy;
  153.             flipx = !flipx;
  154.             flipy = !flipy;
  155.         }
  156.  
  157.         drawgfx(bitmap,gfx,
  158.                 spriteram[offs] + ((attributes<<2) & 0x300),
  159.                 (attributes >> 4) & 3,
  160.                 flipx,flipy,
  161.                 sx,sy,
  162.                 clip,TRANSPARENCY_PEN,15);
  163.     }
  164. }
  165.  
  166. void gng_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  167. {
  168.     tilemap_update(ALL_TILEMAPS);
  169.  
  170.     if (palette_recalc())
  171.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  172.  
  173.     tilemap_render(ALL_TILEMAPS);
  174.  
  175.     tilemap_draw(bitmap,bg_tilemap,TILEMAP_BACK);
  176.     draw_sprites(bitmap);
  177.     tilemap_draw(bitmap,bg_tilemap,TILEMAP_FRONT);
  178.     tilemap_draw(bitmap,fg_tilemap,0);
  179. }
  180.